//
//  ViewController.m
//  ScrollViews
//
//  Created by cygarm on 15/6/4.
//  Copyright (c) 2015年 cygarm. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController



- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 1
    /*
     首先, 你需要使用photo1.png(已经添加到工程中)创建一个image view。
     然后设置image view的frame (大小和位置)尺寸为图片的尺寸，位置在上层视图的（0，0）点。 
     最后将image view添加为scroll view的子视图
     */
    UIImage *image = [UIImage imageNamed: @"photo1.png"];
    imageView = [[UIImageView alloc]initWithImage:image];
    imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
    [self.scrollView addSubview:imageView];
    
    // 2
    /*
     告诉scroll view它里面内容的尺寸, 这样他就知道在水平方向和竖直方向上如何滚动。
     在这里它的大小是图片的尺寸
     */
    self.scrollView.contentSize = image.size;
    
    // 3
    /*
     这里我们设置了一个双击的手势来实现缩放的功能。
     UIScrollView已经内建实现了捏合的手势（UIPinchGestureRecognizer）实现缩放功能，
     因此你不需要自己添加了
     */
    UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(scrollViewDoubleTapped:)];
    doubleTapRecognizer.numberOfTapsRequired = 2;
    doubleTapRecognizer.numberOfTouchesRequired = 1;
    [self.scrollView addGestureRecognizer:doubleTapRecognizer];
    
    // 4
    /*
     下一步, 你要计算出scroll view的最小的缩放尺寸。 
     当缩放尺寸的值是1时表示它的内容会正常显示。小于1的值表示内容会被缩小，大于1的值表示内容会被放大。
     为了计算最小的缩放尺寸, 你要计算出图片正好符合scroll view的宽度的值scaleWidth
     和正好符合scroll view的高度的值scaleHeight，
     scaleWidth和scaleHeight的最小值就是scroll view的最小缩放尺寸。
     这样在缩到最小的时候，你能够看到整个图片
     */
//    CGRect scrollViewFrame = CGRectMake(0, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height);
    CGRect scrollViewFrame = self.scrollView.frame;
    CGFloat scaleWidth = scrollViewFrame.size.width / self.scrollView.contentSize.width;
    CGFloat scaleHeight = scrollViewFrame.size.height / self.scrollView.contentSize.height;
    CGFloat minScale = MIN(scaleWidth, scaleHeight);
    self.scrollView.minimumZoomScale = minScale;
    
    // 5
    /*
     将最大的缩放尺寸设置成1是因为，放大图片超过它的分辨率会引起图片的模糊。
     将初始的缩放尺寸设置成了最小尺寸，就是说开始时整个图片缩到了最小，你能看到完整的图片
     */
    self.scrollView.maximumZoomScale = 1.0;
    self.scrollView.zoomScale = minScale;
    
    // 6
    /*
     调用centerScrollViewContents函数将图片放置到了scroll view的中央
     */
    [self centerScrollViewContents];
}

- (void)centerScrollViewContents {
    /*
     如果scroll view的内容大小比它的边界小，那么会将位置放在左上角而不是中心。
     这是因为你允许用户缩小图片，将图片放置在中心会好一些。
     函数通过这样放置图片使它在scroll view的中心
     */
    CGSize boundsSize = self.scrollView.bounds.size;
    CGRect contentsFrame = imageView.frame;
    
    if (contentsFrame.size.width < boundsSize.width) {
        contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0;
    } else {
        contentsFrame.origin.x = 0.0;
    }
    
    if (contentsFrame.size.height < boundsSize.height) {
        contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0;
    } else {
        contentsFrame.origin.y = 0.0;
    }
    
    imageView.frame = contentsFrame;
}

- (void)scrollViewDoubleTapped:(UITapGestureRecognizer *)recognizer {
    // 1
    /*
     首先，计算出双击在image view中的位置。就像用户期望的那样，我们将会使用这个点作为中心进行放大。
     */
    CGPoint pointInView = [recognizer locationInView:imageView];
    
    // 2
    /*
     接下来, 我们将新的缩放尺寸放大到现在的1.5倍，但不要超过之前在viewDidLoad函数中设置的最大缩放尺寸。
     */
    CGFloat newZoomScale = self.scrollView.zoomScale * 1.5;
    
    // 3
    /*
     然后使用第一步计算出的位置计算要放大的矩形尺寸
     */
    CGSize scrollViewSize = self.scrollView.bounds.size;
    CGFloat w = scrollViewSize.width / newZoomScale;
    CGFloat h = scrollViewSize.height / newZoomScale;
    CGFloat x = pointInView.x - (w / 2.0);
    CGFloat y = pointInView.y - (h / 2.0);
    
    CGRect rectToZoomTo = CGRectMake(x, y, w, h);
    
    // 4
    /*
     最后, 告诉scroll view进行缩放并使用动画效果是缩放看起来更美观
     */
    [self.scrollView zoomToRect:rectToZoomTo animated:true];
}

/*
 这是scroll view实现缩放机制的核心。
 你指出了当进行捏合操作的时候哪一个view将会被放大或者缩小。也就是我们的imageView。
*/
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return imageView;
}

/*
 在类中添加代理方法
 当用户完成缩放操作时这个方法就会被调用。这里你需要重新将试图放置到中心。 
 如果不这样做，scroll view就不会自然地进行缩放，他会出现在左上角
*/
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    [ self centerScrollViewContents];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
